package com.zhentao.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zhentao.dto.ParamCategoryDTO;
import com.zhentao.dto.ParamCategoryQueryDTO;
import com.zhentao.pojo.ParamCategory;
import com.zhentao.vo.ParamCategoryTreeVO;
import com.zhentao.vo.ParamCategoryVO;

import java.util.List;

/**
* @author hp
* @description 针对表【param_category(参数分类表：管理参数的层级分类结构)】的数据库操作Service
* @createDate 2025-08-28 08:36:25
*/
public interface ParamCategoryService extends IService<ParamCategory> {
    
    /**
     * 🌳 获取分类树形结构（核心方法）
     * @return 完整的分类树
     */
    List<ParamCategoryTreeVO> getCategoryTree();
    
    /**
     * 🌳 获取指定父分类下的分类树
     * @param parentId 父分类ID，null表示顶级分类
     * @return 分类树
     */
    List<ParamCategoryTreeVO> getCategoryTreeByParent(Long parentId);
    
    /**
     * 📋 分页查询分类列表
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    Page<ParamCategoryVO> queryCategories(ParamCategoryQueryDTO queryDTO);
    
    /**
     * 🔍 根据ID获取分类详情
     * @param id 分类ID
     * @return 分类详情
     */
    ParamCategoryVO getCategoryDetail(Long id);
    
    /**
     * ➕ 创建分类
     * @param dto 分类信息
     * @return 是否创建成功
     */
    boolean createCategory(ParamCategoryDTO dto);
    
    /**
     * ✏️ 更新分类
     * @param id 分类ID
     * @param dto 更新信息
     * @return 是否更新成功
     */
    boolean updateCategory(Long id, ParamCategoryDTO dto);
    
    /**
     * 🗑️ 删除分类
     * @param id 分类ID
     * @return 是否删除成功
     */
    boolean deleteCategory(Long id);
    
    /**
     * 📊 获取子分类列表
     * @param parentId 父分类ID
     * @return 子分类列表
     */
    List<ParamCategoryVO> getChildCategories(Long parentId);
    
    /**
     * ↕️ 调整分类排序
     * @param categoryId 分类ID
     * @param targetSortOrder 目标排序值
     * @return 是否调整成功
     */
    boolean adjustCategorySortOrder(Long categoryId, Integer targetSortOrder);
    
    /**
     * 🔄 切换分类状态
     * @param id 分类ID
     * @param status 目标状态：1-启用，0-禁用
     * @return 是否切换成功
     */
    boolean toggleCategoryStatus(Long id, Integer status);
    
    /**
     * ✅ 检查分类编码是否可用
     * @param categoryCode 分类编码
     * @param excludeId 排除的ID（用于更新时检查）
     * @return 是否可用
     */
    boolean isCategoryCodeAvailable(String categoryCode, Long excludeId);
    
    /**
     * 📈 获取分类统计信息
     * @param categoryId 分类ID
     * @return 统计信息
     */
    ParamCategoryVO getCategoryStatistics(Long categoryId);
    
    /**
     * 📍 获取分类路径
     * @param categoryId 分类ID
     * @return 分类路径字符串（如：/系统参数/税率参数）
     */
    String getCategoryPath(Long categoryId);
}
